<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <H3> 尽量将逻辑结构垂直化，横向建议不超过3层,建议优先采用模板模式定义好结构</H3>
</body>
</html>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body style="padding:10px;">
<p>说明：
    <span>尽量将逻辑结构垂直化，横向建议不超过3层,建议优先采用模板模式定义好结构</span>
</p>
<br/>
<p>正例：</p>
<div style="margin:10px;padding:10px;border:1px solid #000000;white-space: pre-line;">
    /**
    * 保存发起考试所需业务数据
    * 1. 获取所有业务对象数据
    * 2. 构建考试记录更新参数
    * 3. 更新考试记录考试状态从未发起修改为待考试，审核状态从待审核修改为审核通过
    * 4. 随机试卷需保存考试记录题目/选项数据
    * 5. 保存培训（其他）人员题目数据
    * 6. 保存培训（其他）人员选项数据
    * 7. 如需阅卷，保存阅卷数据
    *      7.1. 保存阅卷人题目关系
    *      7.2. 保存阅卷中心数据
    * 8. 生成协同待办消息
    * @param object        业务数据参数 RecExamTrainOtherRecordSaveVO
    * @author wangzhidong
    * @date 2021/5/13 19:32
    **/
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveStartOtherExamData(Object object) {
        //1. 获取所有业务对象数据
        RecExamTrainOtherRecordSaveVO saveVO = (RecExamTrainOtherRecordSaveVO) object;
        log.error(&quot;保存发起考试所需业务数据开始：saveVO：{}&quot;, saveVO);

        //2. 构建考试记录更新参数
        RecExamTrainOtherRecord record = saveVO.getRecord();
        record.setStatus(ToolUtil.getString(ExamStatus.WAIT_EXAM.getValue()));
        record.setModifyDate(new Date());
        record.setModifyId(ShiroKit.getUser().getId());
        record.setModifyName(ShiroKit.getUser().getName());

        //3. 更新考试记录考试状态从未发起修改为待考试，审核状态从待审核修改为审核通过及数量
        recExamTrainOtherRecordDao.updateById(record);

        //4. 随机试卷需保存考试记录题目/选项数据
        if(RecConstants.ExamType.RANDOM.equals(saveVO.getRecord().getExamType())) {
            questionService.insertBatch(saveVO.getQuestionList());
            if(ToolUtil.isNotEmpty(saveVO.getOptionsList())) {
                optionsService.insertBatch(saveVO.getOptionsList());
            }
        }

        //5. 保存培训（其他）人员题目数据，考虑数据量大情况，放入线程池批量插入
        threadPoolExecutor.execute(()-&gt; recordEmpQuestionService.insertBatch(saveVO.getEmpQuestionList(), 100));

        //6. 保存培训（其他）人员选项数据，考虑数据量大情况，放入线程池批量插入
        if(ToolUtil.isNotEmpty(saveVO.getEmpOptionList())) {
            threadPoolExecutor.execute(()-&gt; recordEmpOptionService.insertBatch(saveVO.getEmpOptionList(), 100));
        }

        //7. 如需阅卷，保存阅卷数据
        if(saveVO.isNeedScoring()) {
            //7.1. 保存阅卷人题目关系
            if(ToolUtil.isNotEmpty(saveVO.getReaderQuestionList())) {
                 readerQuestionService.insertBatch(saveVO.getReaderQuestionList());
            }
            //7.2. 保存阅卷中心数据
            checkingCenterService.insert(saveVO.getCheckingCenter());
        }

        //8. 生成协同待办消息
        this.insertCoporationMsg(saveVO.getRecord(), saveVO.getEmpList());
    }

</div>
<br/>
<p>反例：</p>
<div style="margin:10px;padding:10px;border:1px solid #000000;white-space: pre-line;">
<br/>    try {
<br/>    PerModelSet perModelSet = perModelSetService.getSettings();
<br/>    if (ToolUtil.isNotEmpty(perModelSet)) {
<br/>    if (Objects.equals(perModelSet.getPostNumSetting(), PostConstant.DirectControl.CONTROL)
<br/>    &amp;&amp; Objects.equals(perModelSet.getSynOrgDirect(), PostConstant.DirectSynControl.SYN_ORG_DIRECT)) {
<br/>    /*1.获取所有组织跟岗位的总编制*/
<br/>    List&lt;OrgDirectDto&gt; directDtos = perOrgsDao.countDirectNum(originId, DateTimeKit.nowYmd());
<br/>    if (CollectionKit.isNotEmpty(directDtos)) {
<br/>    List&lt;PerOrgs&gt; perOrgs = new ArrayList&lt;&gt;(directDtos.size());
<br/>    List&lt;OrgDirectDto&gt; orgDirectDtos = directDtos.stream().filter(item -&gt;
<br/>    !Objects.equals(item.getOrgDirectNum(), item.getPostDirectNum())).collect(Collectors.toList());
<br/>    if (CollectionKit.isNotEmpty(orgDirectDtos)) {
<br/>    List&lt;Long&gt; orgOriginIds = orgDirectDtos.stream().map(item -&gt;
<br/>    item.getOriginId()).collect(Collectors.toList());
<br/>    /*2.处理sqlserver 2100 参数问题，查询所有编制不一致的组织信息*/
<br/>    if (sqlSession.getConfiguration().getDatabaseId().equals(DBTypeEx.SQL_SERVER.getDb())) {
<br/>    List&lt;List&lt;Long&gt;&gt; idsList = Lists.partition(orgOriginIds, 2000);
<br/>    for (List&lt;Long&gt; ids : idsList) {
<br/>    perOrgs.addAll(listByOriginIds(ids));
<br/>    }
<br/>    } else {
<br/>    perOrgs = listByOriginIds(orgOriginIds);
<br/>    }
<br/>    //...
<br/>    }
<br/>    }
<br/>    }
<br/>    }
<br/>    // ..
</div>
</body>
</html>